Next.jsアプリのイメージスキャンを新しいAWS Native に移行してみた

Next.jsアプリのイメージスキャンを新しいAWS Native に移行してみた

ECRでNext.jsアプリのイメージスキャンに失敗する事象が発生。原因が従来のベーシックスキャン(Clair)が最新Alpine Linux 3.21をサポートしていなかったことにあったため、新しいベーシックスキャン「AWS Native」への移行を実施し、CIスクリプトを修正することで問題を解決しました。
Clock Icon2025.01.10

Next.jsアプリのコンテナイメージをECRのプライベートレジストリに登録して利用する環境で、CI中で実施していたイメージスキャンに失敗する事象が発生していました。

https://dev.classmethod.jp/articles/app-runner-nextjs/

今回、この調査と対策を実施する機会がありましたので、紹介します。

発生原因

問題の発生した環境は、Docker Hub で公開されている Node のオフィシャルイメージを 最新 alpine を利用するタグ指定で利用していました。

  • Dockerfile抜粋
FROM node:20-alpine AS base

イメージスキャンに失敗していたイメージのステータス (imageScanStatus )を確認したところ、サポート外の OS のため失敗していたことが分かりました。

  • imageScanStatus
"imageScanStatus": {
                "status": "FAILED",
                "description": "UnsupportedImageError: The operating system 'alpine' version 'v3.21' is not supported."
            },

2024年12月にリリースされた Alpine Linux 3.21 、従来の Clair ベースのベーシックスキャンではサポート対象外となっていました。

| Operating System | Version | AWS native basic | Clair basic |
| Alpine Linux (Alpine) | 3.21 | Yes | No |
| Alpine Linux (Alpine) | 3.20 | Yes | Yes |

Scan images for OS vulnerabilities in Amazon ECR

https://alpinelinux.org/posts/Alpine-3.21.0-released.html

暫定対策

ベーシックスキャン「Clair」がサポートする「Alpine 3.20」を指定する事で、暫定対策としました。

  • 暫定対策後(Dockerfile)
FROM node:20-alpine3.20 AS base

https://hub.docker.com/_/node

恒久対策

AWS_NATIVE 有効化

新しいベーシックスキャン「AWS Native」への切り替えをオプトインしました。

プライベートレジストリ

ECR_プライベートレジストリ

オプトイン

ECRスキャン設定オプトイン

ECRスキャン設定オプトイン完了

CI スクリプトの変更

新しいベーシックスキャン「AWS_NATIVE」のオプトイン後、describe-images の実行結果から、imageScanStatus の取得が出来なくなりました。

  • AWS Native オプトイン前 (旧 Clair)
$ aws ecr describe-images --repository-name ${REPOSITORY_NAME} --image-ids imageDigest=${DIGEST}  --query 'imageDetails[0].imageScanStatus'
{
    "status": "COMPLETE",
    "description": "The scan was completed successfully."
}
  • AWS Native オプトイン後
$ aws ecr describe-images --repository-name ${REPOSITORY_NAME} --image-ids imageDigest=${DIGEST}  --query 'imageDetails[0].imageScanStatus'
null

イメージスキャン結果のステータスを describe-image-scan-findings コマンドから取得するよう、スクリプトの修正を実施しました。

$ DIGEST='sha256:****'
$ REPOSITORY_NAME='****-****'
$ REGISTRY_ID='000000000000'
$ IMAGE_TAG=$(aws ecr list-images --repository-name ${REPOSITORY_NAME} --registry-id ${REGISTRY_ID} | jq -r ".imageIds[] | select(.imageDigest == \"${DIGEST}\") | .imageTag")
$ aws ecr describe-image-scan-findings --repository-name ${REPOSITORY_NAME} --image-id imageTag=${IMAGE_TAG} --registry-id ${REGISTRY_ID} --query 'imageScanStatus'
{
    "status": "COMPLETE",
    "description": "The scan was completed successfully."
}

まとめ

2024年8月、 Amazon ECR の新しいベーシックスキャン「AWS Native」がリリースされました。

https://dev.classmethod.jp/articles/new-version-amazon-ecr-basic-scanning/

従来のベーシックスキャン「Clair」は、2025年10月1日でサポート終了となることが2024年11月に案内されました。

https://dev.classmethod.jp/articles/amazon-ecr-basic-scan-clair-end-of-support/

従来のベーシックスキャン「Clair」は2025年10月まで利用できる予定とされていますが、今回紹介した Alpine Linux 3.21 以外にも、最新 OS を中心にサポート外となるイメージが増えることが予想されます。

古いベーシックスキャンを利用するために、OS のバージョンを古いバージョンに留める利用は望ましくありません。実行するアプリケーションが 最新バージョンの OS に追従できる場合、新しいベーシックスキャンをオプトインし「AWS Native」への移行を余裕を持ったスケジュールで実施することをおすすめします。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.